package com.songlanyun.modules.goods.controller.admin;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;

//import org.apache.shiro.authz.annotation.RequiresPermissions;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.songlanyun.common.annotation.RepeatSubmit;
import com.songlanyun.common.annotation.SysLog;
import com.songlanyun.common.enums.SysConstant;
import com.songlanyun.common.utils.Constant;
import com.songlanyun.common.validator.ValidatorUtils;
import com.songlanyun.modules.account.model.vo.MemberStatistics;
import com.songlanyun.modules.goods.entity.GoodsSku;
import com.songlanyun.modules.goods.model.dto.GoodsDTO;
import com.songlanyun.modules.goods.model.dto.GoodsStatusDTO;
import com.songlanyun.modules.goods.model.dto.SetGoodsGroupDTO;
import com.songlanyun.modules.goods.model.vo.GoodsStatistics;
import com.songlanyun.modules.goods.service.GoodsSkuService;
import com.songlanyun.modules.shop.service.ShopService;
import com.songlanyun.modules.user.controller.AbstractController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.songlanyun.modules.goods.entity.Goods;
import com.songlanyun.modules.goods.service.GoodsService;
import com.songlanyun.common.utils.PageUtils;
import com.songlanyun.common.utils.R;


/**
 * 商家所发商品表
 *
 * @author lubo
 * @email sunlightcs@gmail.com
 * @date 2020-11-05 10:01:59
 */
@RestController
@RequestMapping("admin/goods")
public class GoodsAdminController extends AbstractController {
    @Autowired
    private GoodsService goodsService;

    @Autowired
    private ShopService shopService;

    @Autowired
    private GoodsSkuService goodsSkuService;

    @Autowired
    private ThreadPoolExecutor threadPoolExecutor;


    /**
     * 自营商品列表（平台商家自营商品列表 ,加盟商家自营商品列表，平台商家在代销中心商品列表）
     * params参数说明
     * shop_id 商家店铺id必给（由当前登录者登录后关联可得）
     * verify_status 审核状态 可以不给查全部 有效值：（0待审，1通过，2不通过）
     * title 标题（可以不给，用来模糊查询）
     * point_goods 是否是积分商品 可以不给查全部 有效值：（0不是，1是）
     * added 上架状态 可以不给查全部 有效值：（0下架，1上架）
     * group_id 商品分组id 可以不给查全部 可以给一级商品分组，也可给二级商品分组
     * area_feature 商品分区特征(-1 所有商品,0,普通商品,1服务体系礼包,2新人福利区,3公益申领)
     * third  是否是第三方商品（-1，0不是第三方商品，1是第三方商品）
     * page 当前第几页（默认第一页）
     * limit 每页多少条 （默认每页10条）
     */
    @RequestMapping("/self/pages")
    //@RequiresPermissions("goods:self:list")
    public R shopGoodsList(@RequestParam Map<String, Object> params) {
        params.put("shop_id", getShopId());
        PageUtils page = goodsService.querySelfPage(params);
        return R.ok().put("page", page);
    }

    /**
     * 平台查询所有商品（为了审核）
     * * params参数说明
     * * shop_id 商家店铺id可以不给不给查所有
     * * shop_name 商家店铺名乐可以不给不给查所有
     * * verify_status 审核状态 可以不给查全部 有效值：（0待审，1通过，2不通过）
     * * title 标题（可以不给，用来模糊查询）
     * * third  是否是第三方商品（-1，0不是第三方商品，1是第三方商品）
     * * area_feature 商品分区特征(-1 所有商品,0,普通商品,1服务体系礼包,2新人福利区,3公益申领)
     * * page 当前第几页（默认第一页）
     * * limit 每页多少条 （默认每页10条）
     */
    @RequestMapping("/all/pages")
    //@RequiresPermissions("goods:all:list")
    public R allGoodsList(@RequestParam Map<String, Object> params) {
        PageUtils page = goodsService.queryALLPage(params);
        return R.ok().put("page", page);
    }

    @RequestMapping("/all/areaGoods")
    public R allAreaGoodsList() {
        List<Goods> list = goodsService.selectAreaGoods();
        return R.ok().put("page", list);
    }

    /**
     * 代销中心查看平台商家发布的商品，商家可以看到可以代销
     * params参数说明
     * title 标题（可以不给，用来模糊查询）
     * page 当前第几页（默认第一页）
     * limit 每页多少条 （默认每页10条）
     */
    @RequestMapping("/platform_goods/pages")
    //@RequiresPermissions("goods:platform:list")
    public R platFormGoodsList(@RequestParam Map<String, Object> params) {
        params.put("shop_id", getShopId());
        PageUtils page = goodsService.queryPlatformPage(params);
        return R.ok().put("page", page);
    }

    /**
     * 普通商家已经代销的平台总店发布的商品
     * * params参数说明
     * * title 标题（可以不给，用来模糊查询）
     * * page 当前第几页（默认第一页）
     * * limit 每页多少条 （默认每页10条）
     */
    @RequestMapping("/proxy/pages")
    //@RequiresPermissions("goods:proxy:list")
    public R proxyGoodsList(@RequestParam Map<String, Object> params) {
        params.put("shop_id", getShopId());
        PageUtils page = goodsService.queryProxyPage(params);
        return R.ok().put("page", page);
    }


    /**
     * 查询商家的直营商品，并显示是否参加了活动 (秒杀、拼团)
     * * params参数说明
     * * seckill_id 秒杀活动id
     * * group_buy_id 拼团活动id
     * * page 当前第几页（默认第一页）
     * * limit 每页多少条 （默认每页10条）
     */
    @RequestMapping("/self/foractivity/pages")
    //@RequiresPermissions("goods:proxy:list")
    public R querySelfForActivityPage(@RequestParam Map<String, Object> params) {
        params.put("shop_id", getShopId());
        PageUtils page = goodsService.querySelfForActivityPage(params);
        return R.ok().put("page", page);
    }


    /**
     * 后台商家按商品id查询商品
     */
    @RequestMapping("/info/{id}")
    //@RequiresPermissions("shop:goods:info")
    public R getById(@PathVariable("id") Long id) {
        Goods goods = goodsService.getById(id);
        goods.loadPublishAuthGroupList();
        goods.loadGoodsSkuList();
        goods.loadCategory();
        goods.loadHxCategory();
        goods.loadContent();
        return R.ok().put("data", goods);
    }

    /**
     * 后台商家按商品id查询商品
     */
    @RequestMapping("/skus/{id}")
    //@RequiresPermissions("shop:goods:info")
    public R getGoodsSkus(@PathVariable("id") Long id) {
        List<GoodsSku> goodsSkus = goodsSkuService.loadGoodsSkuList(id);
        return R.ok().put("list", goodsSkus);
    }

    /**
     * 保存
     */
    @SysLog("保存商品")
    @RepeatSubmit(value = "5")
    @PostMapping("/create")
    //@RequiresPermissions("shop:goods:create")
    public R create(@RequestBody GoodsDTO dto) {
        Goods goods = goodsService.add(getShopId(), dto);
        return R.ok().put("data", goods);
    }

    /**
     * 修改
     */
    @SysLog("修改商品")
    @RepeatSubmit(value = "5")
    @PutMapping("/update")
    //@RequiresPermissions("shop:goods:update")
    public R update(@RequestBody GoodsDTO dto) {
        Goods goods = goodsService.update(getShopId(), dto);
        return R.ok().put("data", goods);
    }

    /**
     * 平台管理员审核
     */
    @SysLog("平台管理员审核商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/check")
    //@RequiresPermissions("shop:goods:check")
    public R check(@RequestBody GoodsStatusDTO dto) {
        goodsService.check(dto.getGoodsId(), dto);
        return R.ok();
    }

    /**
     * 平台商家设置商品是否可以代销
     */
    @SysLog("平台商家设置商品是否可以代销")
    @RepeatSubmit(value = "3")
    @PutMapping("/set-proxy")
    //@RequiresPermissions("shop:goods:check")
    public R setProxy(@RequestBody GoodsStatusDTO dto) {
        goodsService.setProxy(getShopId(true), dto);
        return R.ok();
    }

    /**
     * 商家设置开启会员折扣
     */
    @SysLog("商家设置开启会员折扣")
    @RepeatSubmit(value = "3")
    @PutMapping("/open-user-discount")
    //@RequiresPermissions("shop:goods:check")
    public R openUserDiscount(@RequestBody GoodsStatusDTO dto) {
        goodsService.openUserDiscount(getShopId(true), dto);
        return R.ok();
    }


    /**
     * 商家上架下架商品
     */
    @SysLog("商家上架下架商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/added")
    //@RequiresPermissions("shop:goods:added")
    public R added(@RequestBody GoodsStatusDTO dto) {
        goodsService.added(getShopId(), dto);
        return R.ok();
    }

    /**
     * 商家设置商品热销商品
     */
    @SysLog("商家设置商品热销商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/hot")
    //@RequiresPermissions("shop:goods:added")
    public R hot(@RequestBody GoodsStatusDTO dto) {
        goodsService.hot(getShopId(), dto);
        return R.ok();
    }

    /**
     * 商家设置商品热销商品
     */
    @SysLog("商家设置商品热销商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/hot/{goodsId}")
    //@RequiresPermissions("shop:goods:added")
    public R hot(@PathVariable("goodsId")Long goodsId) {
        goodsService.hot(goodsId);
        return R.ok();
    }

    /**
     * 商家设置新品
     */
    @SysLog("商家设置新品")
    @RepeatSubmit(value = "3")
    @PutMapping("/new")
    //@RequiresPermissions("shop:goods:added")
    public R newGoods(@RequestBody GoodsStatusDTO dto) {
        goodsService.newGoods(getShopId(), dto);
        return R.ok();
    }

    /**
     * 商家设置推荐商品
     */
    @SysLog("商家设置推荐商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/recommend")
    //@RequiresPermissions("shop:goods:added")
    public R recommend(@RequestBody GoodsStatusDTO dto) {
        goodsService.recommend(getShopId(), dto);
        return R.ok();
    }

    /**
     * 商家代销平台商品
     */
    @SysLog("商家代销平台商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/auth/{goodsId}")
    //@RequiresPermissions("shop:goods:auth")
    public R auth(@PathVariable Long goodsId) {
        goodsService.auth(getShopId(), goodsId);
        return R.ok();
    }

    /**
     * 设置代销商品的商品分组
     */
    @SysLog("设置代销商品的商品分组")
    @RepeatSubmit(value = "3")
    @PutMapping("/auth_goods/groups/set")
    public R setProxyGoodsGroup(@RequestBody SetGoodsGroupDTO dto) {
        goodsService.setProxyGoodsGroup(getShopId(), dto);
        return R.ok();
    }

    /**
     * 商家取消代销平台商品
     */
    @SysLog("商家取消代销平台商品")
    @RepeatSubmit(value = "3")
    @PutMapping("/cancel_auth/{goodsId}")
    //@RequiresPermissions("shop:goods:cancel_auth")
    public R cancelAuth(@PathVariable Long goodsId) {
        goodsService.cancelAuth(getShopId(), goodsId);
        return R.ok();
    }


//    /**
//     * 删除
//     */
//    @RequestMapping("/delete")
//    //@RequiresPermissions("goods:productgoods:delete")
//    public R delete(@RequestBody Long[] ids){
//        goodsService.removeByIds(Arrays.asList(ids));
//        return R.ok();
//    }


    /**
     * 删除
     */
    @SysLog("删除商品")
    @DeleteMapping("/delete/{id}")
    //@RequiresPermissions("goods:productgoods:delete")
    public R delete(@PathVariable("id") Long id) {
        goodsService.delete(getShopId(), id);
        return R.ok();
    }


    /**
     * 后台首页  -- 商品统计
     */
    @GetMapping("/goods-statistics")
    //@RequiresPermissions("goods:productgoods:delete")
    public R goodsStatistics() {
        Long shopId = getShopId(false);
        GoodsStatistics data = new GoodsStatistics();
        CompletableFuture<GoodsStatistics> upGoodsNumFuture = CompletableFuture.supplyAsync(() -> {
            //已下架
            Integer upGoodsNum = goodsService.goodsStatistics(shopId, Constant.DOWN);
            data.setUp(upGoodsNum);
            return data;
        }, threadPoolExecutor);

        CompletableFuture<GoodsStatistics> downGoodsNumFuture = CompletableFuture.supplyAsync(() -> {
            //已上架
            Integer downGoodsNum = goodsService.goodsStatistics(shopId, Constant.UP);
            data.setDown(downGoodsNum);
            return data;
        }, threadPoolExecutor);

        CompletableFuture<GoodsStatistics> rarelyGoodsNumFuture = CompletableFuture.supplyAsync(() -> {
            //库存紧张
            Integer rarelyGoodsNum = goodsService.rarelyGoodsNum(shopId);
            data.setRarely(rarelyGoodsNum);
            return data;
        }, threadPoolExecutor);

        CompletableFuture<GoodsStatistics> allGoodsNumFuture = CompletableFuture.supplyAsync(() -> {
            //全部商品
            Integer allGoodsNum = goodsService.goodsStatistics(shopId, null);
            data.setAll(allGoodsNum);
            return data;
        }, threadPoolExecutor);

        try {
            CompletableFuture.allOf(
                    upGoodsNumFuture,
                    downGoodsNumFuture,
                    rarelyGoodsNumFuture,
                    allGoodsNumFuture
            ).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return R.ok().put("data", data);
    }
}
